Növelje a webhely sebessĂ©gĂ©t Ă©s a felhasználĂłi Ă©lmĂ©nyt JavaScript teljesĂtmĂ©nyoptimalizálási technikákkal: kĂłdszĂ©tválasztás Ă©s lusta kiĂ©rtĂ©kelĂ©s. Tudja meg, hogyan Ă©s mikor használja Ĺ‘ket az optimális eredmĂ©nyekĂ©rt.
JavaScript teljesĂtmĂ©nyoptimalizálás: KĂłdszĂ©tválasztás vs. Lusta kiĂ©rtĂ©kelĂ©s
A mai digitális környezetben a weboldal teljesĂtmĂ©nye kiemelten fontos. A lassĂş betöltĂ©si idĹ‘k frusztrált felhasználĂłkhoz, magasabb visszafordulási arányhoz Ă©s vĂ©gsĹ‘ soron negatĂv ĂĽzleti hatáshoz vezethetnek. A JavaScript, bár elengedhetetlen a dinamikus Ă©s interaktĂv webes Ă©lmĂ©nyek lĂ©trehozásához, gyakran szűk keresztmetszetet jelenthet, ha nem kezelik gondosan. KĂ©t hatĂ©kony technika a JavaScript teljesĂtmĂ©nyĂ©nek optimalizálására a kĂłdszĂ©tválasztás Ă©s a lusta kiĂ©rtĂ©kelĂ©s. Ez az átfogĂł ĂştmutatĂł mindkĂ©t technikát bemutatja, feltárva működĂ©sĂĽket, elĹ‘nyeiket, hátrányaikat, Ă©s azt, hogy mikor Ă©rdemes használni Ĺ‘ket az optimális eredmĂ©nyek elĂ©rĂ©sĂ©hez.
A JavaScript optimalizálás szükségességének megértése
A modern webalkalmazások gyakran nagymĂ©rtĂ©kben támaszkodnak a JavaScriptre a gazdag funkcionalitás biztosĂtásához. Azonban az alkalmazások bonyolultságának növekedĂ©sĂ©vel a JavaScript kĂłd mennyisĂ©ge is nĹ‘, ami nagyobb csomagmĂ©retekhez vezet. Ezek a nagy csomagok jelentĹ‘sen befolyásolhatják a kezdeti oldalbetöltĂ©si idĹ‘t, mivel a böngĂ©szĹ‘nek le kell töltenie, Ă©rtelmeznie Ă©s vĂ©grehajtania az összes kĂłdot, mielĹ‘tt az oldal interaktĂvvá válna.
KĂ©pzeljĂĽnk el egy nagy e-kereskedelmi platformot számos funkciĂłval, mint pĂ©ldául termĂ©kszűrĂ©s, keresĂ©si funkciĂł, felhasználĂłi hitelesĂtĂ©s Ă©s interaktĂv termĂ©kgalĂ©riák. Mindezek a funkciĂłk jelentĹ‘s JavaScript kĂłdot igĂ©nyelnek. MegfelelĹ‘ optimalizálás nĂ©lkĂĽl a felhasználĂłk lassĂş betöltĂ©si idĹ‘ket tapasztalhatnak, kĂĽlönösen mobileszközökön vagy lassabb internetkapcsolattal. Ez negatĂv felhasználĂłi Ă©lmĂ©nyhez Ă©s potenciális ĂĽgyfĂ©lvesztĂ©shez vezethet.
EzĂ©rt a JavaScript teljesĂtmĂ©nyĂ©nek optimalizálása nem csupán technikai rĂ©szlet, hanem a pozitĂv felhasználĂłi Ă©lmĂ©ny biztosĂtásának Ă©s az ĂĽzleti cĂ©lok elĂ©rĂ©sĂ©nek kulcsfontosságĂş eleme.
Kódszétválasztás: Nagy csomagok felosztása
Mi az a kódszétválasztás?
A kódszétválasztás egy olyan technika, amely a JavaScript kódot kisebb, könnyebben kezelhető darabokra vagy csomagokra osztja. Ahelyett, hogy az alkalmazás teljes kódját előre betöltené, a böngésző csak a kezdeti oldalbetöltéshez szükséges kódot tölti le. A későbbi kódblokkok igény szerint töltődnek be, ahogy a felhasználó az alkalmazás különböző részeivel interakcióba lép.
Gondoljon erre Ăgy: kĂ©pzeljen el egy fizikai könyvesboltot. Ahelyett, hogy megprĂłbálná az összes általa eladott könyvet a kirakatba zsĂşfolni, ami lehetetlennĂ© tennĂ©, hogy bárki tisztán lásson bármit is, gondosan összeállĂtott válogatást mutat be. A többi könyvet máshol tárolják az ĂĽzletben, Ă©s csak akkor veszik elĹ‘, ha egy vásárlĂł kifejezetten kĂ©ri Ĺ‘ket. A kĂłdszĂ©tválasztás hasonlĂłan működik, csak a kezdeti nĂ©zethez szĂĽksĂ©ges kĂłdot jelenĂti meg, Ă©s a többi kĂłdot szĂĽksĂ©g szerint tölti be.
Hogyan működik a kódszétválasztás?
A kĂłdszĂ©tválasztás kĂĽlönbözĹ‘ szinteken valĂłsĂthatĂł meg:
- Belépési pont szerinti felosztás: Ez magában foglalja az alkalmazás különböző részeinek külön belépési pontjainak létrehozását. Például lehetnek külön belépési pontjai a fő alkalmazásnak, egy adminisztrációs felületnek és egy felhasználói profiloldalnak.
- Útvonal alapú felosztás: Ez a technika az alkalmazás útvonalai alapján osztja fel a kódot. Minden útvonal egy adott kódblokknak felel meg, amely csak akkor töltődik be, ha a felhasználó arra az útvonalra navigál.
- Dinamikus importok: A dinamikus importok lehetĹ‘vĂ© teszik a modulok igĂ©ny szerinti, futásidejű betöltĂ©sĂ©t. Ez rĂ©szletes vezĂ©rlĂ©st biztosĂt a kĂłd betöltĂ©sĂ©nek idĹ‘pontja felett, lehetĹ‘vĂ© tĂ©ve a nem kritikus kĂłd betöltĂ©sĂ©nek elhalasztását, amĂg tĂ©nylegesen szĂĽksĂ©g van rá.
A kódszétválasztás előnyei
- Javult kezdeti betöltĂ©si idĹ‘: A kezdeti csomagmĂ©ret csökkentĂ©sĂ©vel a kĂłdszĂ©tválasztás jelentĹ‘sen javĂtja az oldal kezdeti betöltĂ©si idejĂ©t, ami gyorsabb Ă©s reszponzĂvabb felhasználĂłi Ă©lmĂ©nyt eredmĂ©nyez.
- Csökkentett hálĂłzati sávszĂ©lessĂ©g: Csak a szĂĽksĂ©ges kĂłd betöltĂ©se csökkenti a hálĂłzaton keresztĂĽl továbbĂtandĂł adatok mennyisĂ©gĂ©t, sávszĂ©lessĂ©get takarĂtva meg a felhasználĂł Ă©s a szerver számára egyaránt.
- Javult gyorsĂtĂłtár-kihasználás: A kisebb kĂłddarabok nagyobb valĂłszĂnűsĂ©ggel kerĂĽlnek gyorsĂtĂłtárba a böngĂ©szĹ‘ben, csökkentve az ĂşjbĂłli letöltĂ©s szĂĽksĂ©gessĂ©gĂ©t a kĂ©sĹ‘bbi látogatások során.
- Jobb felhasználói élmény: A gyorsabb betöltési idők és a csökkentett hálózati sávszélesség hozzájárulnak a gördülékenyebb és élvezetesebb felhasználói élményhez.
Példa: React a React.lazy és Suspense használatával
A React-ben a kĂłdszĂ©tválasztás könnyen megvalĂłsĂthatĂł a React.lazy Ă©s Suspense használatával. A React.lazy lehetĹ‘vĂ© teszi a komponensek dinamikus importálását, mĂg a Suspense mĂłdot biztosĂt egy tartalĂ©k felhasználĂłi felĂĽlet (pl. egy betöltĂ©si animáciĂł) megjelenĂtĂ©sĂ©re, amĂg a komponens betöltĹ‘dik.
import React, { Suspense } from 'react';
const OtherComponent = React.lazy(() => import('./OtherComponent'));
function MyComponent() {
return (
Loading... }>
Ebben a pĂ©ldában az OtherComponent csak akkor töltĹ‘dik be, amikor renderelĹ‘dik. AmĂg betöltĹ‘dik, a felhasználĂł a "Loading..." ĂĽzenetet látja.
Eszközök a kódszétválasztáshoz
- Webpack: Egy népszerű modulkötegelő, amely különféle kódszétválasztási technikákat támogat.
- Rollup: Egy másik modulkötegelĹ‘, amely kis, hatĂ©kony csomagok lĂ©trehozására összpontosĂt.
- Parcel: Egy nulla konfigurációjú kötegelő, amely automatikusan kezeli a kódszétválasztást.
- Vite: Egy build eszköz, amely natĂv ES modulokat használ a gyors fejlesztĂ©shez Ă©s optimalizált produkciĂłs buildekhez.
Lusta kiĂ©rtĂ©kelĂ©s: SzámĂtások elhalasztása
Mi az a lusta kiértékelés?
A lusta kiĂ©rtĂ©kelĂ©s, más nĂ©ven halasztott kiĂ©rtĂ©kelĂ©s, egy olyan programozási technika, ahol egy kifejezĂ©s kiĂ©rtĂ©kelĂ©se addig kĂ©sik, amĂg az Ă©rtĂ©kĂ©re tĂ©nylegesen szĂĽksĂ©g van. Más szĂłval, a számĂtásokat csak akkor hajtják vĂ©gre, amikor az eredmĂ©nyeikre szĂĽksĂ©g van, ahelyett, hogy azonnal elĹ‘re kiszámĂtanák Ĺ‘ket.
KĂ©pzelje el, hogy több fogásos Ă©telt kĂ©szĂt. Nem fĹ‘zne meg minden Ă©telt egyszerre. Ehelyett minden Ă©telt csak akkor kĂ©szĂtene el, amikor eljön a tálalás ideje. A lusta kiĂ©rtĂ©kelĂ©s hasonlĂłan működik, csak akkor hajtja vĂ©gre a számĂtásokat, amikor az eredmĂ©nyeikre szĂĽksĂ©g van.
Hogyan működik a lusta kiértékelés?
JavaScriptben a lusta kiĂ©rtĂ©kelĂ©s kĂĽlönbözĹ‘ technikákkal valĂłsĂthatĂł meg:
- FĂĽggvĂ©nyek: Egy kifejezĂ©s fĂĽggvĂ©nybe valĂł csomagolása lehetĹ‘vĂ© teszi az Ă©rtĂ©kelĂ©sĂ©nek elhalasztását a fĂĽggvĂ©ny meghĂvásáig.
- Generátorok: A generátorok mĂłdot biztosĂtanak iterátorok lĂ©trehozására, amelyek igĂ©ny szerint állĂtanak elĹ‘ Ă©rtĂ©keket.
- Memorizálás (Memoization): A memorizálás magában foglalja a drága fĂĽggvĂ©nyhĂvások eredmĂ©nyeinek gyorsĂtĂłtárazását, Ă©s a gyorsĂtĂłtárazott eredmĂ©ny visszaadását, amikor ugyanazok a bemenetek ismĂ©tlĹ‘dnek.
- Proxy-k: A proxy-k segĂtsĂ©gĂ©vel le lehet fogni a tulajdonságok hozzáfĂ©rĂ©sĂ©t, Ă©s el lehet halasztani a tulajdonságĂ©rtĂ©kek számĂtását addig, amĂg tĂ©nylegesen hozzáfĂ©rnek hozzájuk.
A lusta kiértékelés előnyei
- Javult teljesĂtmĂ©ny: A felesleges számĂtások elhalasztásával a lusta kiĂ©rtĂ©kelĂ©s jelentĹ‘sen javĂthatja a teljesĂtmĂ©nyt, kĂĽlönösen nagy adathalmazok vagy komplex számĂtások esetĂ©n.
- Csökkentett memóriahasználat: A lusta kiértékelés csökkentheti a memóriahasználatot azáltal, hogy elkerüli az azonnal nem szükséges köztes értékek létrehozását.
- Növelt reszponzivitás: A felesleges számĂtások elkerĂĽlĂ©sĂ©vel a kezdeti betöltĂ©s során a lusta kiĂ©rtĂ©kelĂ©s növelheti az alkalmazás reszponzivitását.
- VĂ©gtelen adatstruktĂşrák: A lusta kiĂ©rtĂ©kelĂ©s lehetĹ‘vĂ© teszi, hogy vĂ©gtelen adatstruktĂşrákkal, pĂ©ldául vĂ©gtelen listákkal vagy adatfolyamokkal dolgozzon, csak a szĂĽksĂ©ges elemeket kiszámĂtva igĂ©ny szerint.
Példa: Képek lusta betöltése
A lusta kiĂ©rtĂ©kelĂ©s gyakori felhasználási esete a kĂ©pek lusta betöltĂ©se. Ahelyett, hogy az összes kĂ©pet elĹ‘re betöltenĂ© egy oldalon, elhalaszthatja azoknak a kĂ©peknek a betöltĂ©sĂ©t, amelyek kezdetben nem láthatĂłk a nĂ©zetablakban. Ez jelentĹ‘sen javĂthatja a kezdeti oldalbetöltĂ©si idĹ‘t Ă©s csökkentheti a hálĂłzati sávszĂ©lessĂ©g-felhasználást.
function lazyLoadImages() {
const images = document.querySelectorAll('img[data-src]');
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
observer.unobserve(img);
}
});
});
images.forEach((img) => {
observer.observe(img);
});
}
document.addEventListener('DOMContentLoaded', lazyLoadImages);
Ez a pĂ©lda az IntersectionObserver API-t használja annak Ă©szlelĂ©sĂ©re, hogy mikor lĂ©p be egy kĂ©p a nĂ©zetablakba. Amikor egy kĂ©p láthatĂłvá válik, a src attribĂştuma a data-src attribĂştum Ă©rtĂ©kĂ©re állĂtĂłdik, ami elindĂtja a kĂ©p betöltĂ©sĂ©t. Az observer ezután leállĂtja a kĂ©p figyelĂ©sĂ©t, hogy megakadályozza annak ismĂ©telt betöltĂ©sĂ©t.
Példa: Memorizálás
A memorizálás használhatĂł a drága fĂĽggvĂ©nyhĂvások optimalizálására. ĂŤme egy pĂ©lda:
function memoize(func) {
const cache = {};
return function(...args) {
const key = JSON.stringify(args);
if (cache[key]) {
return cache[key];
}
const result = func(...args);
cache[key] = result;
return result;
};
}
function expensiveCalculation(n) {
// Simulate a time-consuming calculation
for (let i = 0; i < 100000000; i++) {
// Do something
}
return n * 2;
}
const memoizedCalculation = memoize(expensiveCalculation);
console.time('First call');
console.log(memoizedCalculation(5)); // First call - takes time
console.timeEnd('First call');
console.time('Second call');
console.log(memoizedCalculation(5)); // Second call - returns cached value instantly
console.timeEnd('Second call');
Ebben a pĂ©ldában a memoize fĂĽggvĂ©ny bemenetkĂ©nt egy fĂĽggvĂ©nyt vesz fel, Ă©s visszaadja annak egy memorizált változatát. A memorizált fĂĽggvĂ©ny gyorsĂtĂłtárazza a korábbi hĂvások eredmĂ©nyeit, Ăgy az azonos argumentumokkal törtĂ©nĹ‘ kĂ©sĹ‘bbi hĂvások a gyorsĂtĂłtárazott eredmĂ©nyt adhatják vissza az eredeti fĂĽggvĂ©ny ĂşjbĂłli vĂ©grehajtása nĂ©lkĂĽl.
Kódszétválasztás vs. Lusta kiértékelés: Fő különbségek
Bár mind a kĂłdszĂ©tválasztás, mind a lusta kiĂ©rtĂ©kelĂ©s hatĂ©kony optimalizálási technikák, a teljesĂtmĂ©ny kĂĽlönbözĹ‘ aspektusait kezelik:
- KĂłdszĂ©tválasztás: A kezdeti csomagmĂ©ret csökkentĂ©sĂ©re összpontosĂt, a kĂłd kisebb darabokra osztásával Ă©s igĂ©ny szerinti betöltĂ©sĂ©vel. ElsĹ‘sorban a kezdeti oldalbetöltĂ©si idĹ‘ javĂtására szolgál.
- Lusta kiĂ©rtĂ©kelĂ©s: Az Ă©rtĂ©kek számĂtásának elhalasztására összpontosĂt, amĂg tĂ©nylegesen szĂĽksĂ©g van rájuk. ElsĹ‘sorban a teljesĂtmĂ©ny javĂtására szolgál drága számĂtások vagy nagy adathalmazok kezelĂ©sekor.
LĂ©nyegĂ©ben a kĂłdszĂ©tválasztás csökkenti az elĹ‘re letöltendĹ‘ kĂłd mennyisĂ©gĂ©t, mĂg a lusta kiĂ©rtĂ©kelĂ©s csökkenti az elĹ‘re elvĂ©gzendĹ‘ számĂtások mennyisĂ©gĂ©t.
Mikor használjunk kódszétválasztást vs. lusta kiértékelést
Kódszétválasztás
- Nagy alkalmazások: Használjon kódszétválasztást olyan alkalmazásokhoz, amelyek sok JavaScript kódot tartalmaznak, különösen azokhoz, amelyek több útvonallal vagy funkcióval rendelkeznek.
- Kezdeti betöltĂ©si idĹ‘ javĂtása: Használjon kĂłdszĂ©tválasztást a kezdeti oldalbetöltĂ©si idĹ‘ javĂtására Ă©s az interaktĂvvá válási idĹ‘ csökkentĂ©sĂ©re.
- HálĂłzati sávszĂ©lessĂ©g csökkentĂ©se: Használjon kĂłdszĂ©tválasztást a hálĂłzaton keresztĂĽl továbbĂtandĂł adatok mennyisĂ©gĂ©nek csökkentĂ©sĂ©re.
Lusta kiértékelés
- Drága számĂtások: Használjon lusta kiĂ©rtĂ©kelĂ©st olyan fĂĽggvĂ©nyekhez, amelyek drága számĂtásokat vĂ©geznek vagy nagy adathalmazokhoz fĂ©rnek hozzá.
- Reszponzivitás javĂtása: Használjon lusta kiĂ©rtĂ©kelĂ©st az alkalmazás reszponzivitásának javĂtására a felesleges számĂtások elhalasztásával a kezdeti betöltĂ©s során.
- Végtelen adatstruktúrák: Használjon lusta kiértékelést végtelen adatstruktúrákkal való munkához, mint például végtelen listák vagy adatfolyamok.
- MĂ©dia lusta betöltĂ©se: ValĂłsĂtson meg lusta betöltĂ©st kĂ©pek, videĂłk Ă©s egyĂ©b mĂ©diaeszközök esetĂ©n az oldalbetöltĂ©si idĹ‘k javĂtása Ă©rdekĂ©ben.
A kódszétválasztás és a lusta kiértékelés kombinálása
Sok esetben a kĂłdszĂ©tválasztás Ă©s a lusta kiĂ©rtĂ©kelĂ©s kombinálhatĂł, hogy mĂ©g nagyobb teljesĂtmĂ©nynövekedĂ©st Ă©rjĂĽnk el. PĂ©ldául használhatja a kĂłdszĂ©tválasztást az alkalmazás kisebb darabokra valĂł felosztására, majd a lusta kiĂ©rtĂ©kelĂ©st az Ă©rtĂ©kek számĂtásának elhalasztására ezeken a darabokon belĂĽl.
TekintsĂĽnk egy e-kereskedelmi alkalmazást. Használhatna kĂłdszĂ©tválasztást az alkalmazás kĂĽlönállĂł csomagokra valĂł felosztására a termĂ©klista oldal, a termĂ©k rĂ©szletes oldala Ă©s a pĂ©nztár oldal számára. Ezután a termĂ©k rĂ©szletes oldalán belĂĽl lusta kiĂ©rtĂ©kelĂ©st használhatna a kĂ©pek betöltĂ©sĂ©nek vagy a termĂ©kajánlások számĂtásának elhalasztására, amĂg tĂ©nylegesen szĂĽksĂ©g van rájuk.
A kódszétválasztáson és lusta kiértékelésen túl: További optimalizálási technikák
Bár a kĂłdszĂ©tválasztás Ă©s a lusta kiĂ©rtĂ©kelĂ©s hatĂ©kony technikák, csak kĂ©t darabja a JavaScript teljesĂtmĂ©nyoptimalizálásának. ĂŤme nĂ©hány további technika, amelyet a teljesĂtmĂ©ny további javĂtására használhat:
- Minifikálás: TávolĂtsa el a szĂĽksĂ©gtelen karaktereket (pl. szĂłközök, megjegyzĂ©sek) a kĂłdbĂłl a mĂ©retĂ©nek csökkentĂ©se Ă©rdekĂ©ben.
- TömörĂtĂ©s: TömörĂtse a kĂłdot Gzip vagy Brotli eszközökkel a mĂ©retĂ©nek további csökkentĂ©se Ă©rdekĂ©ben.
- GyorsĂtĂłtárazás: Használja ki a böngĂ©szĹ‘ gyorsĂtĂłtárazását Ă©s a CDN gyorsĂtĂłtárazását a szerver felĂ© irányulĂł kĂ©rĂ©sek számának csökkentĂ©sĂ©re.
- Tree Shaking (FahomályosĂtás): TávolĂtsa el a nem használt kĂłdot a csomagjaibĂłl a mĂ©retĂĽk csökkentĂ©se Ă©rdekĂ©ben.
- KĂ©poptimalizálás: Optimalizálja a kĂ©peket tömörĂtĂ©ssel, megfelelĹ‘ mĂ©retre állĂtással Ă©s modern kĂ©pformátumok, pĂ©ldául a WebP használatával.
- Debouncing Ă©s Throttling: Szabályozza az esemĂ©nykezelĹ‘k vĂ©grehajtásának sebessĂ©gĂ©t a teljesĂtmĂ©nyproblĂ©mák megelĹ‘zĂ©se Ă©rdekĂ©ben.
- Hatékony DOM manipuláció: Minimalizálja a DOM manipulációkat és használjon hatékony DOM manipulációs technikákat.
- Web Workers: Vigye át a számĂtásigĂ©nyes feladatokat web worker-ekre, hogy megakadályozza a fĹ‘ szál blokkolását.
Összegzés
A JavaScript teljesĂtmĂ©nyoptimalizálás kulcsfontosságĂş eleme a pozitĂv felhasználĂłi Ă©lmĂ©ny biztosĂtásának Ă©s az ĂĽzleti cĂ©lok elĂ©rĂ©sĂ©nek. A kĂłdszĂ©tválasztás Ă©s a lusta kiĂ©rtĂ©kelĂ©s kĂ©t hatĂ©kony technika, amelyek jelentĹ‘sen javĂthatják a teljesĂtmĂ©nyt a kezdeti betöltĂ©si idĹ‘k csökkentĂ©sĂ©vel, a hálĂłzati sávszĂ©lessĂ©g-felhasználás mĂ©rsĂ©klĂ©sĂ©vel Ă©s a felesleges számĂtások elhalasztásával. Azáltal, hogy megĂ©rti ezeknek a technikáknak a működĂ©sĂ©t Ă©s mikor kell Ĺ‘ket használni, gyorsabb, reszponzĂvabb Ă©s Ă©lvezetesebb webalkalmazásokat hozhat lĂ©tre.
Ne feledje figyelembe venni az egyedi alkalmazáskövetelmĂ©nyeit, Ă©s használja azokat a technikákat, amelyek a legmegfelelĹ‘bbek az Ă–n igĂ©nyeinek. Folyamatosan figyelje alkalmazása teljesĂtmĂ©nyĂ©t, Ă©s ismĂ©telje meg optimalizálási stratĂ©giáit, hogy a lehetĹ‘ legjobb felhasználĂłi Ă©lmĂ©nyt nyĂşjtsa. Fogadja el a kĂłdszĂ©tválasztás Ă©s a lusta kiĂ©rtĂ©kelĂ©s erejĂ©t, hogy olyan webalkalmazásokat hozzon lĂ©tre, amelyek nemcsak funkciĂłkban gazdagok, hanem nagy teljesĂtmĂ©nyűek Ă©s világszerte örömteliek is használni.
További tanulmányi források
- Webpack dokumentáció: https://webpack.js.org/
- Rollup dokumentáció: https://rollupjs.org/guide/en/
- Vite dokumentáció: https://vitejs.dev/
- MDN Web Docs - Intersection Observer API: https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API
- Google Developers - JavaScript végrehajtás optimalizálása: https://developers.google.com/web/fundamentals/performance/optimizing-javascript/